/**
 * 
 */
package br.com.ac.fatureweb.model;

import java.util.Date;
import java.util.List;

import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.EnumType;
import javax.persistence.Enumerated;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.OneToMany;
import javax.persistence.SequenceGenerator;
import javax.persistence.Table;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;
import javax.persistence.Transient;

import br.com.ac.fatureweb.enums.Status;
import br.com.ac.fatureweb.utilitary.Model;

/**
 * @author aldivone
 *
 */
@Entity
@Table(name = "ROTEIRO")
@SequenceGenerator(name = "SEQ_ROTEIRO", sequenceName = "SEQ_ROTEIRO", allocationSize = 1, initialValue = 1)
public class Roteiro extends Model {

	/**
	 * 
	 */
	private static final long serialVersionUID = 5092570669469776388L;

	@Id
	@GeneratedValue(generator = "SEQ_ROTEIRO", strategy = GenerationType.SEQUENCE)
	@Column(name = "ID")
	private Long id;

	@Column(name = "NUMERO")
	private Integer numero;

	@Column(name = "ORDEM")
	private Integer ordem;

	@Column(name = "COD_SETOR")
	private Long codSetor;

	@Column(name = "COMPETENCIA")
	private Long competencia;

	@Column(name = "DATA_GERACAO")
	@Temporal(TemporalType.TIMESTAMP)
	private Date dataGeracao;

	@Column(name = "DATA_CARGA")
	@Temporal(TemporalType.TIMESTAMP)
	private Date dataCarga;

	@Column(name = "DATA_RETORNO")
	@Temporal(TemporalType.TIMESTAMP)
	private Date dataRetorno;

	@Column(name = "DATA_FATURAMENTO")
	@Temporal(TemporalType.TIMESTAMP)
	private Date dataFaturamento;

	@Enumerated(EnumType.ORDINAL)
	@Column(name = "STATUS")
	private Status status;

	@Column(name = "QTD_IMOVEL")
	private Integer qtdImovel;

	@Column(name = "LONGITUDE")
	private Double longitude;

	@Column(name = "LATITUDE")
	private Double latitude;

	@ManyToOne(fetch = FetchType.LAZY, optional = false)
	@JoinColumn(name = "ID_CARGA", referencedColumnName = "ID")
	private Carga carga;

	@ManyToOne
	@JoinColumn(name = "ID_EQUIPAMENTO", referencedColumnName = "ID")
	private Equipamento equipamento;

	@OneToMany(cascade = CascadeType.ALL, orphanRemoval = true, fetch = FetchType.LAZY)
	@JoinColumn(name = "ID_ROTEIRO", referencedColumnName = "ID")
	private List<ItemRoteiro> lstItemRoteiro;

	@Transient
	private List<ItemRoteiro> lstItemOrfao;

	@Transient
	private Long qtdItensOrfaos;

	@Transient
	private Long qtdItensEmRoteiro;

	@Transient
	private Integer qtdLeiturista;

	public Roteiro() {
		super();
	}

	public Roteiro(Long id) {
		super();
		this.id = id;
	}

	public Roteiro(Long id, Integer numero, Integer ordem, Long competencia,
			Date dataGeracao, Date dataCarga, Date dataRetorno,
			Date dataFaturamento, Status status, Integer qtdImovel,
			Carga carga, Equipamento equipamento,
			List<ItemRoteiro> lstItemRoteiro, Integer qtdLeiturista) {
		super();
		this.id = id;
		this.numero = numero;
		this.ordem = ordem;
		this.competencia = competencia;
		this.dataGeracao = dataGeracao;
		this.dataCarga = dataCarga;
		this.dataRetorno = dataRetorno;
		this.dataFaturamento = dataFaturamento;
		this.status = status;
		this.qtdImovel = qtdImovel;
		this.carga = carga;
		this.equipamento = equipamento;
		this.lstItemRoteiro = lstItemRoteiro;
		this.qtdLeiturista = qtdLeiturista;
	}

	public Roteiro(Long id, Integer numero, Long competencia, Status status,
			Integer qtdImovel, Date dataFaturamento, Date dataCarga,
			Date dataRetorno, String nome) {
		this.id = id;
		this.numero = numero;
		this.competencia = competencia;
		this.dataCarga = dataCarga;
		this.dataRetorno = dataRetorno;
		this.dataFaturamento = dataFaturamento;
		this.status = status;
		this.qtdImovel = qtdImovel;
		this.equipamento = new Equipamento();
		equipamento.setLeiturista(new Leiturista());
		equipamento.getLeiturista().setNome(nome);
	}

	public Roteiro(Long id, Integer numero, Long competencia, Status status,
			Integer qtdImovel, Date dataFaturamento, Date dataCarga,
			Date dataRetorno, String nome, Long codSetor) {
		this.id = id;
		this.numero = numero;
		this.competencia = competencia;
		this.dataCarga = dataCarga;
		this.dataRetorno = dataRetorno;
		this.dataFaturamento = dataFaturamento;
		this.status = status;
		this.qtdImovel = qtdImovel;
		this.codSetor = codSetor;
		this.equipamento = new Equipamento();
		equipamento.setLeiturista(new Leiturista());
		equipamento.getLeiturista().setNome(nome);
	}

	public Roteiro(Long id, Long competencia, Date dataGeracao, Date dataCarga,
			Date dataRetorno, Status status, Carga carga,
			Equipamento equipamento, List<ItemRoteiro> lstItemRoteiro) {
		super();
		this.id = id;
		this.competencia = competencia;
		this.dataGeracao = dataGeracao;
		this.dataCarga = dataCarga;
		this.dataRetorno = dataRetorno;
		this.status = status;
		this.carga = carga;
		this.equipamento = equipamento;
		this.lstItemRoteiro = lstItemRoteiro;
	}

	public Long getId() {
		return id;
	}

	public void setId(Long id) {
		this.id = id;
	}

	public Long getCompetencia() {
		return competencia;
	}

	public void setCompetencia(Long competencia) {
		this.competencia = competencia;
	}

	public Date getDataGeracao() {
		return dataGeracao;
	}

	public void setDataGeracao(Date dataGeracao) {
		this.dataGeracao = dataGeracao;
	}

	public Date getDataCarga() {
		return dataCarga;
	}

	public void setDataCarga(Date dataCarga) {
		this.dataCarga = dataCarga;
	}

	public Date getDataRetorno() {
		return dataRetorno;
	}

	public void setDataRetorno(Date dataRetorno) {
		this.dataRetorno = dataRetorno;
	}

	public Status getStatus() {
		return status;
	}

	public void setStatus(Status status) {
		this.status = status;
	}

	public Carga getCarga() {
		return carga;
	}

	public void setCarga(Carga carga) {
		this.carga = carga;
	}

	public Equipamento getEquipamento() {
		return equipamento;
	}

	public void setEquipamento(Equipamento equipamento) {
		this.equipamento = equipamento;
	}

	public List<ItemRoteiro> getLstItemRoteiro() {
		return lstItemRoteiro;
	}

	public void setLstItemRoteiro(List<ItemRoteiro> lstItemRoteiro) {
		this.lstItemRoteiro = lstItemRoteiro;
	}

	/**
	 * @return the qtdLeiturista
	 */
	public Integer getQtdLeiturista() {
		return qtdLeiturista;
	}

	/**
	 * @param qtdLeiturista
	 *            the qtdLeiturista to set
	 */
	public void setQtdLeiturista(Integer qtdLeiturista) {
		this.qtdLeiturista = qtdLeiturista;
	}

	/**
	 * @return the numero
	 */
	public Integer getNumero() {
		return numero;
	}

	/**
	 * @param numero
	 *            the numero to set
	 */
	public void setNumero(Integer numero) {
		this.numero = numero;
	}

	/**
	 * @return the qtdImovel
	 */
	public Integer getQtdImovel() {
		return qtdImovel;
	}

	/**
	 * @param qtdImovel
	 *            the qtdImovel to set
	 */
	public void setQtdImovel(Integer qtdImovel) {
		this.qtdImovel = qtdImovel;
	}

	/**
	 * @return the ordem
	 */
	public Integer getOrdem() {
		return ordem;
	}

	/**
	 * @param ordem
	 *            the ordem to set
	 */
	public void setOrdem(Integer ordem) {
		this.ordem = ordem;
	}

	/**
	 * @return the dataFaturamento
	 */
	public Date getDataFaturamento() {
		return dataFaturamento;
	}

	/**
	 * @param dataFaturamento
	 *            the dataFaturamento to set
	 */
	public void setDataFaturamento(Date dataFaturamento) {
		this.dataFaturamento = dataFaturamento;
	}

	/**
	 * @return the lstItemOrfao
	 */
	public List<ItemRoteiro> getLstItemOrfao() {
		return lstItemOrfao;
	}

	/**
	 * @param lstItemOrfao
	 *            the lstItemOrfao to set
	 */
	public void setLstItemOrfao(List<ItemRoteiro> lstItemOrfao) {
		this.lstItemOrfao = lstItemOrfao;
	}

	/**
	 * @return the qtdItensOrfaos
	 */
	public Long getQtdItensOrfaos() {
		return qtdItensOrfaos;
	}

	/**
	 * @param qtdItensOrfaos
	 *            the qtdItensOrfaos to set
	 */
	public void setQtdItensOrfaos(Long qtdItensOrfaos) {
		this.qtdItensOrfaos = qtdItensOrfaos;
	}

	/**
	 * @return the qtdItensEmRoteiro
	 */
	public Long getQtdItensEmRoteiro() {
		return qtdItensEmRoteiro;
	}

	/**
	 * @param qtdItensEmRoteiro
	 *            the qtdItensEmRoteiro to set
	 */
	public void setQtdItensEmRoteiro(Long qtdItensEmRoteiro) {
		this.qtdItensEmRoteiro = qtdItensEmRoteiro;
	}

	/**
	 * @return the longitude
	 */
	public Double getLongitude() {
		return longitude;
	}

	/**
	 * @param longitude
	 *            the longitude to set
	 */
	public void setLongitude(Double longitude) {
		this.longitude = longitude;
	}

	/**
	 * @return the latitude
	 */
	public Double getLatitude() {
		return latitude;
	}

	/**
	 * @param latitude
	 *            the latitude to set
	 */
	public void setLatitude(Double latitude) {
		this.latitude = latitude;
	}

	/**
	 * @return the codSetor
	 */
	public Long getCodSetor() {
		return codSetor;
	}

	/**
	 * @param codSetor
	 *            the codSetor to set
	 */
	public void setCodSetor(Long codSetor) {
		this.codSetor = codSetor;
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see java.lang.Object#hashCode()
	 */
	@Override
	public int hashCode() {
		final int prime = 31;
		int result = super.hashCode();
		result = prime * result + ((id == null) ? 0 : id.hashCode());
		return result;
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see java.lang.Object#equals(java.lang.Object)
	 */
	@Override
	public boolean equals(Object obj) {
		if (this == obj) {
			return true;
		}
		if (!super.equals(obj)) {
			return false;
		}
		if (!(obj instanceof Roteiro)) {
			return false;
		}
		Roteiro other = (Roteiro) obj;
		if (id == null) {
			if (other.id != null) {
				return false;
			}
		} else if (!id.equals(other.id)) {
			return false;
		}
		return true;
	}

}